home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 June
/
EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso
/
earcd
/
utilsys
/
rss14gmd.lha
/
RSys_1.4gmd
/
Asm
/
RSysTrap.asm
< prev
Wrap
Assembly Source File
|
1996-04-08
|
2KB
|
88 lines
;GMD CSECT __MERGED
CSECT __ZZZZ
; far code
; public _geta4
; public __trapexception
; public __initfpu
XDEF __trapexception
XDEF __initfpu
xref __oldtrap
xref __traphandler
xref _geta4
DEFTRAP MACRO ;&signalnumber
cmp.w \1,d0 ;compare trap number
beq _deftrap ;branch to default traphandler
ENDM
MYTRAP MACRO ;&signalnumber
cmp.w \1,d0 ;compare trap number
beq _mytrap ;branch to own traphandler
ENDM
__trapexception:
movem.l d0/a4,-(sp) ;need some registers
jsr _geta4 ;set up a4
move.l 8(sp),d0 ;get trap number
DEFTRAP #1 ;define the traphandler
DEFTRAP #2
DEFTRAP #3
MYTRAP #4
MYTRAP #5
MYTRAP #6
DEFTRAP #7
MYTRAP #8
MYTRAP #9
DEFTRAP #10
DEFTRAP #11
MYTRAP #12
DEFTRAP #13
DEFTRAP #14
DEFTRAP #15
MYTRAP #16
_deftrap:
move.l 4(sp),d0 ;get a4 for later
move.l __oldtrap,4(sp) ;get regular handler
move.l d0,a4 ;set real a4 value
move.l (sp)+,d0 ;restore d0 contents
rte ;jump to it
_mytrap:
move.l a0,-(sp) ;save a0
move.l usp,a0 ;get user stack pointer
move.l 18(sp),-(a0) ;save old pc
move.w 14(sp),-(a0) ;save old sr
movem.l d0-d7/a0-a6,-(a0) ;save old registers
movem.l (sp)+,d1/d2/d3 ;restore d0/a0/a4
move.l d1,(a0) ;set d0
move.l d2,32(a0) ;set a0
move.l d3,48(a0) ;set a4
move.l d0,-(a0) ;pass trap number on stack
lea _conttrap,a1 ;get return in case they want to continue
move.l a1,-(a0) ;set return address
move.l a0,usp ;set new user stack pointer
lea __traphandler,a0 ;get trap handler
move.l a0,6(sp) ;modify rte address
addq #4,sp ;remove trap #
rte ;go and do the handler
_conttrap:
add.w #4,sp ;pop arg
movem.l (sp)+,d0-d7/a0-a6 ;restore old registers
move.w (sp)+,ccr ;restore old condition codes
rts ;and continue where we left off
__initfpu:
; mc68881
fmove.l FPCR,d0
or.w #$1400,d0
fmove.l d0,FPCR
rts
END